package pe.com.empresa.servicios.impl;

import java.util.Date;
import java.util.List;
import pe.com.empresa.datos.dao.OrdenCompraDetalleMapper;
import pe.com.empresa.datos.dominio.EstadoOrdenCompra;
import pe.com.empresa.datos.dominio.OrdenCompra;
import pe.com.empresa.datos.dominio.OrdenCompraDetalle;
import pe.com.empresa.datos.dominio.OrdenCompraDetalleExample;
import pe.com.empresa.servicios.servicio.GestionarOrdenCompraService;
import pe.com.empresa.utiles.Constantes;
import pe.com.empresa.utiles.EstadoOperacion;
import pe.com.empresa.utiles.GrillaArticulos;
import pe.com.empresa.utiles.SecuenciaUtil;
import pe.com.empresa.utiles.ServiceHelper;

public class GestionarOrdenCompraServiceImpl extends ServiceHelper implements
		GestionarOrdenCompraService {

	@Override
	public EstadoOperacion registrarOrdenCompra(OrdenCompra orden,
			List<OrdenCompraDetalle> detalle) throws Exception {
		EstadoOperacion estado = new EstadoOperacion();
		this.openSession();
		try{
			
			String secuencia = SecuenciaUtil.obtenerSecuencia(Constantes.TABLA_ORDEN_COMPRA, session);
			orden.setNumeroOrdenCompra(secuencia);
			this.insertar(orden);
			
			EstadoOrdenCompra estadoOrden = new EstadoOrdenCompra();
			estadoOrden.setEstado(Constantes.ESTADO_ORDEN_COMPRA_GENERADO);
			estadoOrden.setFechaRegistro(new Date());
			estadoOrden.setIdResponsable(orden.getIdGenerador());
			estadoOrden.setNumeroOrdenCompra(secuencia);
			
			this.insertar(estadoOrden);

			for (OrdenCompraDetalle dt : detalle) {
				dt.setNumeroOrdenCompra(secuencia);
				this.insertar(dt);
			}

			this.commit();


			estado.setCodigoGenerado(secuencia);
			estado.setMensajeEstado("[SUCCESS] Orden de Compra Generada con exito, numero "+ secuencia + ".");
			estado.setEstadoOperacion(Constantes.OP_SUCCESS);
			
		}catch(Exception e){
			
			this.rollback();
			estado.setMensajeEstado("[ERROR] Generando Orden de compra, intentelo mas tarde.");
			estado.setEstadoOperacion(Constantes.OP_EXCEPTION);
			
			e.printStackTrace();
			
		}finally{
			this.closeSession();
		}

		return estado;
	}

	@Override
	public EstadoOperacion editarOrdenCOmpra(OrdenCompra orden,
			List<GrillaArticulos> detalle) throws Exception {
		
		EstadoOperacion estado = new EstadoOperacion();
		
		this.openSession();
		
		try{
			
			this.actualizar(orden);
						
			OrdenCompraDetalleExample exmaple = new OrdenCompraDetalleExample();
			exmaple.createCriteria().andNumeroOrdenCompraEqualTo(orden.getNumeroOrdenCompra());
			
			OrdenCompraDetalleMapper mapper = this.session.getMapper(OrdenCompraDetalleMapper.class);
			List<OrdenCompraDetalle> dt = mapper.selectByExample(exmaple);
			
			boolean existe=false;
			for(OrdenCompraDetalle d : dt){
				existe=false;
				for(GrillaArticulos g : detalle){
					if(g.getCodigoArticulo().equals(d.getCodigoArticulo()) && g.getFlag() == null){
						existe=true;
					}
				}
				if(!existe){
					
					mapper.deleteByPrimaryKey(d.getNumeroOrdenCompra(),d.getCodigoArticulo());
					System.out.println("elimino");
					
				}
			}

			for(GrillaArticulos g : detalle){
				if(g.getFlag() != null){
					OrdenCompraDetalle dtOrden = new OrdenCompraDetalle();
					dtOrden.setNumeroOrdenCompra(orden.getNumeroOrdenCompra());
					dtOrden.setCodigoArticulo(g.getCodigoArticulo());
					dtOrden.setCantidadArticulo(g.getCantidadArticulo());
					dtOrden.setPrecioUnitario(g.getPrecio());
					this.insertar(dtOrden);
				}
			}
			
			this.commit();

			estado.setMensajeEstado("[SUCCESS] Orden de Compra actualizada con exito.");
			estado.setEstadoOperacion(Constantes.OP_SUCCESS);
			
		}catch(Exception e){
			
			this.rollback();
			estado.setMensajeEstado("[ERROR] Generando Orden de compra, intentelo mas tarde.");
			estado.setEstadoOperacion(Constantes.OP_EXCEPTION);
			
			e.printStackTrace();
			
		}finally{
			this.closeSession();
		}

		return estado;
	}

}
